#include<iostream>
#include<string>
#include<future>
#include<memory>


int Add(int num1 ,int num2)
{
    return num1 + num2;
}



int main()
{
    // //version 1
    // //1.封装任务
    // std::packaged_task<int (int ,int)> task(Add);

    // //2.关联future
    // std::future<int> result_future =task.get_future();

    // //3.执行
    // task(25,36);
    // //获取结果
    // int result = result_future.get();
    //std::cout << result <<std::endl;



    //version 2 实用版本
    auto taskp = std::make_shared<std::packaged_task<int (int ,int)>> (Add);

    std::future<int> result_future = taskp->get_future();

    //实践中不会将其直接传入线程中,这样会导致频繁创建线程和销毁线程 ,一般是将其传入线程池
    std::thread thread1 ([taskp](){
        (*taskp)(25,36);
    }
    );
    
    thread1.join();
    std::cout << result_future.get() <<std::endl;
    return 0;
}